// src/api/index.js
import axios from 'axios';
import { useAuthStore } from '@/stores/auth'; // 稍后会用到 authStore
import { ElMessage } from 'element-plus'; // 用于显示错误

// 创建 Axios 实例
const apiClient = axios.create({
  baseURL: 'http://localhost:5000/api', // 你的后端 API 地址
  withCredentials: true, // 允许跨域时携带 Cookie
  headers: {
    'Content-Type': 'application/json'
  }
});

// --- 请求拦截器 ---
// 主要用于将来可能需要添加的逻辑，例如 CSRF Token（如果后端启用）
// 或者根据需要添加 API Key (虽然我们目前选择在调用时添加)
apiClient.interceptors.request.use(config => {
  // const authStore = useAuthStore(); // 在拦截器中使用 Pinia store 需要注意初始化顺序

  // 移除之前从 localStorage 添加 Bearer Token 的逻辑，因为我们主要依赖 HttpOnly Cookie
  // const token = localStorage.getItem('token');
  // if (token) {
  //   config.headers.Authorization = `Bearer ${token}`;
  // }

  // 示例：如果将来需要为特定请求添加 API Key Header
  // if (config.url.startsWith('/poi') && config.method === 'get' && authStore.apikey) {
  //   config.headers['X-API-KEY'] = authStore.apikey;
  // }

  return config;
}, error => {
  return Promise.reject(error);
});

// --- 响应拦截器 ---
// 用于统一处理后端返回的错误信息
apiClient.interceptors.response.use(
  response => {
    // 后端返回的 code 不是 2xx 时，也可能表示业务错误
    // 我们的后端 api_response 格式会在 HTTP 200 OK 时也包含 code 和 message
    const resData = response.data; // 后端返回的数据结构 { code, message, data, timestamp }
    if (resData && resData.code !== 200 && resData.code !== 201) {
       ElMessage.error(resData.message || '发生未知业务错误');
       // 可以选择抛出错误中断 Promise 链，或者返回特定值
       return Promise.reject(new Error(resData.message || '发生未知业务错误'));
    }
    // 如果 code 是 200 或 201，直接返回响应（让调用者处理 data）
    return response;
  },
  error => {
    // 处理 HTTP 状态码错误 (4xx, 5xx)
    let message = '请求失败';
    if (error.response) {
      // 后端返回了错误响应
      const errorData = error.response.data; // { code, message, data, timestamp } 或其他格式
      console.error('API Error Response:', error.response);
      message = errorData?.message || `请求错误: ${error.response.status}`;

      // 特殊处理 401 未授权错误 -> 可能是 JWT 过期或未登录
      if (error.response.status === 401) {
          message = '认证失败或登录已过期，请重新登录。';
          // 可以在这里触发登出逻辑
          const authStore = useAuthStore(); // 获取 store 实例
          authStore.logout(); // 调用 logout action
          // 可以考虑跳转到登录页
          // router.push('/login'); // 需要引入 router
      }
      // 处理 403 禁止访问
       if (error.response.status === 403) {
           message = errorData?.message || '您没有权限执行此操作。';
       }
      // 处理 429 限速
      if (error.response.status === 429) {
           message = errorData?.message || '请求过于频繁，请稍后再试。';
       }

    } else if (error.request) {
      // 请求已发出，但没有收到响应
      console.error('API No Response:', error.request);
      message = '无法连接到服务器，请检查网络';
    } else {
      // 设置请求时触发了错误
      console.error('API Request Setup Error:', error.message);
      message = `请求设置错误: ${error.message}`;
    }

    ElMessage.error(message);
    return Promise.reject(error); // 继续抛出错误，让调用处也能捕获
  }
);

export default apiClient; // 导出配置好的实例